#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,K,T;
const int N=2e5+5;
int A[N],a[N],c[N];
int X[5];
string s[N];
int Len[N];
struct Tree{
    int l,r,R,C;
    ll sum;
    bool win;
}tree[N<<2];
#define ls p<<1
#define rs p<<1|1
ll Ans[N];
void up(int p){
    int R=tree[p].R,C=tree[p].C;
    if(!tree[ls].win&&!tree[rs].win){
        tree[p].win=0;
        tree[p].sum=tree[ls].sum+tree[rs].sum;
    }
    else if(tree[ls].win&&!tree[rs].win){
        if(s[R][C]=='0'){
            if(a[tree[ls].sum]>=R)tree[p].win=1,tree[p].sum=tree[ls].sum;
            else tree[p].win=0,tree[p].sum=tree[rs].sum;
        }
        else{
            tree[p].sum=tree[ls].sum+tree[rs].sum,tree[p].win=0;
        }
    }
    else if(!tree[ls].win&&tree[rs].win){
        if(s[R][C]=='1'){
            if(a[tree[rs].sum]>=R)tree[p].sum=tree[rs].sum,tree[p].win=1;
            else tree[p].win=0,tree[p].sum=tree[ls].sum;
        }
        else{
            tree[p].sum=tree[ls].sum+tree[rs].sum,tree[p].win=0;
        }
    }
    else{
        tree[p].win=1;
        if(s[R][C]=='0'){
            if(a[tree[ls].sum]>=R)tree[p].sum=tree[ls].sum;
            else tree[p].sum=tree[rs].sum;
        }
        else{
            if(a[tree[rs].sum]>=R)tree[p].sum=tree[rs].sum;
            else tree[p].sum=tree[ls].sum;
        }
    }
    return;
}
void build(int l,int r,int R,int p){
    ++Len[R];
    tree[p].R=R,tree[p].C=Len[R];
    tree[p].l=l,tree[p].r=r;
    if(l==r){
        tree[p].win=1;
        tree[p].sum=l;
        return;
    }
    int mid=l+r>>1;
    build(l,mid,R-1,ls);
    build(mid+1,r,R-1,rs);
    up(p);
    if(l==1)Ans[r]=tree[p].sum;
    return;
}
ll query(int l,int r,int p){
    if(l==1&&r==tree[p].r)return tree[p].sum;
    int mid=tree[p].l+tree[p].r>>1;
    return query(l,r,ls);
}
void solve(){
    for(int i=0;i<=K;i++)Len[i]=0;
    build(1,(1<<K),K,1);
    int k=0;
    ll ans=0;
    Ans[1]=1;
    for(int i=1;i<=m;i++)ans^=1ll*i*Ans[c[i]];
    printf("%lld\n",ans);
    return;
}
signed main(){
    freopen("arena.in","r",stdin);
    freopen("arena.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&A[i]);
    for(int i=1;i<=m;i++)scanf("%d",&c[i]);
    for(K=1;;K++){
        cin>>s[K];
        s[K]=' '+s[K];
        if((1<<K)>=n)break;
    }
    scanf("%d",&T);
    while(T--){
        scanf("%d %d %d %d",&X[0],&X[1],&X[2],&X[3]);
        for(int i=1;i<=n;i++)a[i]=(A[i]^X[i%4]);
        solve();
    }
    return 0;
}
/*
5 1
0 0 0 0 0
4
1001
10
1
1
2 1 0 0
*/